import {isSafeNum} from '@/num'
import {isObjHas} from '@/obj'


/**
 * 时间单位名称字符串常量对象
 */
export const TimeUnit = {
  millisecond: 'millisecond',
  second: 'second',
  minute: 'minute',
  hour: 'hour',
  day: 'day',
  week: 'week',
  month: 'month',
  year: 'year',
} as const


/**
 * 时间单位名称字符串类型
 */
export type TimeUnitType = typeof TimeUnit[keyof typeof TimeUnit]


/**
 * 时间单位转换率（以秒为基准）<br/>
 * 需要注意的是：这里月转换率是以 30 天为基准计算的，年转换率是以 365 天为基准计算的
 */
export const conversionRates: { [key in TimeUnitType]: number } = {
  millisecond: 0.001,
  second: 1,
  minute: 60,
  hour: 3600,
  day: 86400,
  week: 604800,
  month: 2592000,
  year: 31536000,
}


/**
 * 时间单位转换
 *
 * @param {number} time 时间值
 * @param {TimeUnitType} fromUnit 源单位
 * @param {TimeUnitType} toUnit 目标单位，默认为秒
 * @returns {number} 目标单位的时间值
 * @throws {Error} 如果输入的时间值无效或时间单位不支持
 */
export const convertTime = (
  time: number,
  fromUnit: TimeUnitType,
  toUnit: TimeUnitType = TimeUnit.second,
): number => {
  // 检查输入的时间值是否有效
  if (!isSafeNum(time)) throw new Error('时间值必须是一个有效的数字')
  // 检查源单位和目标单位是否有效
  if (!isObjHas(conversionRates, fromUnit) || !isObjHas(conversionRates, toUnit)) throw new Error('无效的时间单位')
  // 将输入值转换为秒
  const timeInSeconds = time * conversionRates[fromUnit];
  // 将秒转换为目标单位
  return timeInSeconds / conversionRates[toUnit];
}
